
#include "linklist.h"


/***********************************************************/
/*创建一个链表，并初始化，链表最大长度为5个，当超过5个时，
 * 将以前的数据丢弃，将新的数据插入链表中，成功返回链表的
 * 首地址*/
/***********************************************************/
linklist_t linklist_create(void)
{
	linklist_t linklist = (linklist_t)malloc(sizeof(linknode_t));
	linklist->next = NULL;
	linklist->prev = NULL;
	bzero(&(linklist->data_bag), sizeof(linklist_t));
	
	linklist->node_num = 0;

	return linklist;
}

/***************************************************************/
/*向链表中插入数据包，head为要插入的链表，data_pac为要插入的数据包
 * 地址，无返回值*/
/***************************************************************/
void linklist_insert(linklist_t head, struct env_info * data_pac)
{
	linklist_t linknode = (linklist_t)malloc(sizeof(linknode_t));
	linknode->data_bag = *data_pac;

	if(head->node_num < LIST_LEN)
	{
back:if(0 == head->node_num)
		{
			printf("will insert in first:%d\n", head->node_num);
			head->node_num++;
			head->prev = linknode;
			head->next = linknode;
			linknode->prev = head;
			linknode->next = head;
		}
		else
		{
			printf("will insert in after:%d\n", head->node_num);
			head->node_num++;

			linklist_t p;
			p = head->next;
			linknode->prev = p->prev;		//linknode指向前一个节点
			linknode->next = p;//linknode指向后一个节点
			(p->prev)->next = linknode;		//head指向linknode
			p->prev = linknode;//linknode的后一个节点指向linknode
		}
	}
	else
	{
		int i;
		linklist_t p;
		printf("dayu5shi:%d\n", head->node_num);
		for(i = 0; i < LIST_LEN; i++)
		{
			printf("%d, will delete\n", head->node_num);
			p = head->next;
			head->next = p->next;
			p->next->prev = head;

			head->node_num--;
			printf("i = %d, delete:%d\n", i, head->node_num);
			free(p);
		}
		printf("head = %p head->prev = %p head->next = %p\n", head, head->prev, head->next);
		printf("after delete:%d\n", head->node_num);
		head->prev = NULL;
		head->next = NULL;
		goto back;

	}
}

/**************************************************************/
/*从链表中取出一个数据，并将该数据所在节点删除，head为要取出数据
 * 的链表名，ret存放取出的数据节点，应在程序中定义一个相应的结构
 * 体struct env_info * ret = (struct env_info *)malloc(sizeof(struct env_info))，
 * 将其结构体的地址传入，该结构体中就有了链表中哦功能取出的数据*/
/**************************************************************/
void linklist_get(linklist_t head, struct env_info * ret)
{
	struct linklist * p;
	ret = &(head->next->data_bag);
	
	p = head->next;
	head->next = p->next;
	p->next->prev = head;
	free(p);
	head->node_num--;
}

